package com.atguigu.bigdata.scala.chapter05

object Scala05_Function_Normal {

    def main(args: Array[String]): Unit = {

        // TODO 函数式编程 - 普通

        // TODO 1. 函数参数的个数没有限制
        //    动态参数 - 可变参数
        // 参数可以根据传值自动发生变化
        // 需要将参数声明时，类型后面增加特殊符号 ： *, 这里的星号表示多（动态）
        // 传值的时候就可以传递一个参数，或多个参数，甚至不传
        // 所谓的动态参数，其实就是参数的类型为集合
        //val s = "zhangsan" * 2
        //println(s)
        def fun1( name : String* ): Unit = {
            //println(name)
        }

        //fun1()
        //fun1("zhangsan")
        //fun1("zhangsan", "lisi", "wangwu", "zhaoliu")

        // 如果参数列表中含有可变参数，那么这个可变参数应该放置在列表的最后声明
        // 一个函数不允许声明多个可变参数的
        def fun11( age : Int, name:Any*  ): Unit = {

        }
        //fun11(20, "zhangsan", 20)

        // TODO 2. 参数的默认值
        // scala中的双等号等同于非空后的equals操作
        // 默认情况下，函数的参数是使用val声明的，所以不能修改的
        // 为了解决这个问题，scala提供了一个参数默认值的语法：声明参数的时候可以直接提供默认值
        // 声明参数的时候，同时提供默认值，那么在调用函数时，如果函数不传递参数，那么就自动使用默认值
        // 参数默认值和可变参数不能联合使用
        def fun2( password : String = "000000" ): Unit = {
//            if ( password == null || password == "" ) {
//                password = "000000"
//            }
            println(password)
        }

        //fun2("123123") // 123123
        //fun2() // 000000

        // TODO 3. 带名参数
        def fun3( password : String = "000000", loginacct:String ): Unit = {
            println( "Acc : " + loginacct + ", Pswd : " + password )
        }

        //fun3( "123123", "zhangsan" )
        // 函数的参数按照顺序传值的，第一个值给第一个参数，第二个值给第二个参数,依此类推。。。
        // 如果想要改变传值顺序，需要采用特殊的语法操作：带名参数
        // 在函数调用传值的时候，把参数的名称同时带上
        fun3(  loginacct="zhangsan" )


    }
}
